2014-02-24 122 views
-1

我有一小段代码和一个很大的疑问。为什么Python中这两个变量的值都会改变?

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改变值?我怎样才能解决这个问题?

预先感谢您:)

+0

看看你的第二行 – millhouse

+1

你能用你正在使用的语言标记这个问题吗? – Blorgbeard

+0

是的。我想将s的值赋给s1。但我不想修改这两个变量。我只想修改s1并使其保持初始值 – mea

回答

3

在你的第二行,你正在做新的参考送

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 

你可以看到,sreference count增加1

从蟒蛇docs

(赋值语句在Python中,他们创造的目标和对象之间的绑定不要复制对象)。

+0

提到':'是一个[“切片运算符”](http://stackoverflow.com/questions/509211/pythons-slice-notation) – Blorgbeard

+0

谢谢Vanda。它的工作,但我仍然不明白为什么Python这样做。我认为每个人都会作出不同的参考 – mea

1

这里引用是相同的两个变量s & S1。因此,如果您修改1,则其他(与第一个相同)将自动进行修改。

因此,您需要使用代码中's'的参数来创建's1'(语法取决于语言)的新实例。

我希望这能回答你的问题。

2

您遇到的问题是s1=s未复制。它没有列出新的列表,它只是说“变量s1应该是指s的另一种方式。”所以当你修改一个时,你可以通过另一个看到变化。

为避免此问题,请复制s并将其存储到s1中。有几种方法可以在Python中执行此操作,并且覆盖了this question and its answers.

0

您可以在此处使用“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()创建的深度副本是一个新的容器,其中填充了原始对象内容的副本。例如,构建一个新列表,并复制原始列表的元素,然后将这些副本添加到新列表中。

相关问题