我看了一下 python 代码,其中字符串变量赋值如下所示:
var1 = var2[:]
我只是想知道有什么区别:
var1 = var2
这是我的实验:
>>> original = "some text"
>>> copy1 = original
>>> copy2 = original[:]
>>> original = "another text"
>>> copy1
'some text'
>>> copy2
'some text'
更新:
这是完整的 code .此代码搜索替换密码的 key 。 如果我删除“[:]”,此代码将运行得很慢。
请您参考如下方法:
由于interning ,两者之间通常(在生成的对象中)没有区别。我们可以使用 is 检查两个变量是否指向同一个对象运算符,与 == 相反运算符检查对象的实际内存地址是否相同:
>>> a = "foo"
>>> b = a
>>> a is b
True
>>> c = a[:]
>>> a is c
True
Interning 是一种节省内存和加速不可变对象(immutable对象)比较的机制,它的工作原理是这样的:在创建新的不可变对象(immutable对象)之前,python 检查是否已经存在相同的不可变对象(immutable对象)。如果是这样,它只是使用对现有对象的引用。它可以无害地做到这一点,因为没有办法改变不可变的。这就是为什么即使是两个独立创建的字符串也可能指向同一个对象:
>>> a = "foo"
>>> b = "foo"
>>> a is b
True
但是如果 var2是一些可变的顺序对象,比如 list , 然后 var2[:]将是 var2 的浅拷贝,这样对其中一个进行更改不会影响另一个。
>>> a = list("foo")
>>> a
['f', 'o', 'o']
>>> b = a
>>> b is a
True
>>> c = a[:]
>>> c is a
False
>>> b.pop()
'o'
>>> a
['f', 'o']
>>> b
['f', 'o']
>>> c
['f', 'o', 'o']
要了解全貌,请阅读 Ashwini Chaudharys 的回答。
