我有一小段代码和一个很大的疑问。
s=['a','+','b']
s1=s
print s1
del s1[1]
print s1
print s
输出是
value of s1 ['a', '+', 'b']
value of s1 ['a', 'b']
value of s ['a', 'b']
为什么当我单独修改 s1 时变量 's' 的值会发生变化?我怎样才能解决这个问题?
先感谢您 :)
我有一小段代码和一个很大的疑问。
s=['a','+','b']
s1=s
print s1
del s1[1]
print s1
print s
输出是
value of s1 ['a', '+', 'b']
value of s1 ['a', 'b']
value of s ['a', 'b']
为什么当我单独修改 s1 时变量 's' 的值会发生变化?我怎样才能解决这个问题?
先感谢您 :)
在您的第二行中,您正在对 s 进行新的引用
s1=s
如果你想要不同的变量使用slice operator
:
s1 = s[:]
输出:
>>> s=['a','+','b']
>>> s1=s[:]
>>> print s1
['a', '+', 'b']
>>> del s1[1]
>>> print s1
['a', 'b']
>>> print s
['a', '+', 'b']
这是您之前所做的:
>>> import sys
>>> s=['a','+','b']
>>> sys.getrefcount(s)
2
>>> s1 = s
>>> sys.getrefcount(s)
3
你可以看到引用计数增加s
了 1
来自 python文档
(Python 中的赋值语句不会复制对象,它们会在目标和对象之间创建绑定。)。
您遇到的问题是s1=s
无法复制。它没有创建一个新列表,它只是说“变量s1
应该是另一种引用方式s
”。因此,当您修改一个时,您可以通过另一个看到更改。
为避免此问题,请制作一份副本s
并将其存储到s1
. 在 Python 中有几种方法可以做到这一点,这些方法都包含在这个问题及其答案中。
这里变量 s 和 s1 的引用是相同的。因此,如果您修改 1 那么 other (与第一个相同)将自动被修改。
因此,您需要在代码中使用“s”的参数创建“s1”的新实例(语法取决于语言)。
您可以在此处使用“deepcopy()”。
>>> s = ['a','+','b']
>>> s1 = s
>>> print s1
['a', '+', 'b']
>>> del s1[1]
>>> print s1
['a', 'b']
>>> print s
['a', 'b']
>>> import copy
>>> s = ['a','+','b']
>>> s1 = copy.deepcopy(s)
>>> print s1
['a', '+', 'b']
>>> del s1[1]
>>> print s1
['a', 'b']
>>> print s
['a', '+', 'b']
deepcopy() 创建的深层副本是一个新容器,其中填充了原始对象内容的副本。例如,构造一个新列表并复制原始列表的元素,然后将副本附加到新列表中。