在这里考虑这个列表:
example=[]
还有一个:
python=["hi","bye","hello","yes","no"]
如果我决定将 python 中的一个元素添加到示例中,是否会创建该元素 b 的副本,或者变量 python 是否会丢失一个元素。
example+=[python[0]]
那么字符串“hi”是否会被复制或转移到使用上述示例的示例
在这里考虑这个列表:
example=[]
还有一个:
python=["hi","bye","hello","yes","no"]
如果我决定将 python 中的一个元素添加到示例中,是否会创建该元素 b 的副本,或者变量 python 是否会丢失一个元素。
example+=[python[0]]
那么字符串“hi”是否会被复制或转移到使用上述示例的示例
字符串“hi”将被拆分为字符并example
在您执行时分配example+=python[0]
所以example
在这种情况下将包含['h','i']
.
此外,列表python
不会丢失任何元素。
不,不会有“转移”。这很容易检查,只需在操作后打印值即可。
相反,列表示例将附加第一个字符串的元素:
>>> f = []
>>> f+= ["hi", "there"][0]
>>> f
['h', 'i']
发生这种情况是因为a += b
在概念上* 等效于a = a+b
, 并a+b
创建了一个列表,其中包含 的所有元素,a
后跟 的元素b
。字符串是序列,其中的元素是由单个字符组成的字符串,这就是你得到这种行为的原因。
*
存在差异,尤其是那list + nonlist
行不通。
那么字符串“hi”会被复制或转移吗?
不,字符串"hi"
既不会被复制也不会被转移。相反,example
绑定到的对象的长度将增加一,并且引用example[0]
将绑定到绑定到的任何对象python[0]
。此外,引用python
和它所绑定的对象都不会被修改。
另请注意,您的问题在示例中存在错误。你实际上说的地方,
example += python[0]
你肯定是想说:
example += [python[0]]
Python 列表仅存储对元素的引用。元素(这里是字符串)存储为外部对象。
任何 Python 赋值都只复制一个引用值。这样,列表被实现为存储引用的动态数组。
如果将字符串插入列表,则不会复制源字符串对象,只会复制对同一对象的引用。源元素(此处)在赋值右侧使用时python[0]
不会从列表中删除。python
它只是被阅读并且保持不变。
您必须执行以下操作 example.append(python[0] 这将采用 'hi' 并复制到示例