我看一下python代码,其中字符串变量赋值如下所示:
var1 = var2[:]
Run Code Online (Sandbox Code Playgroud)
我只是想知道有什么区别:
var1 = var2
Run Code Online (Sandbox Code Playgroud)
这是我的实验:
>>> original = "some text"
>>> copy1 = original
>>> copy2 = original[:]
>>> original = "another text"
>>> copy1
'some text'
>>> copy2
'some text'
Run Code Online (Sandbox Code Playgroud)
更新:
这是一个完整的代码.此代码搜索替换密码的密钥.如果我删除'[:]',这段代码将非常缓慢.
由于实习,两者之间通常没有差异(在结果对象中).我们可以通过使用is运算符检查两个变量是否指向同一个对象,这与==运算符检查对象的实际内存地址是否相同:
>>> a = "foo"
>>> b = a
>>> a is b
True
>>> c = a[:]
>>> a is c
True
Run Code Online (Sandbox Code Playgroud)
实习是一种节省内存和加速不可变对象比较的机制,它的工作方式如下:在创建新的不可变之前,python检查是否已存在相同的不可变.如果是这样,它只使用对现有对象的引用.它可以做到这一点没有伤害,因为没有办法改变不可变的.这就是为什么即使两个独立创建的字符串也可能指向同一个对象:
>>> a = "foo"
>>> b = "foo"
>>> a is b
True
Run Code Online (Sandbox Code Playgroud)
但是如果var2是一些可变的顺序对象,比如a 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']
Run Code Online (Sandbox Code Playgroud)
为了全面了解,还阅读了Ashwini Chaudharys的回答.
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |