字符串赋值

dem*_*mas 1 python

我看一下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)

更新:

这是一个完整的代码.此代码搜索替换密码的密钥.如果我删除'[:]',这段代码将非常缓慢.

Lau*_*low 5

由于实习,两者之间通常没有差异(在结果对象中).我们可以通过使用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的回答.