[英]Copy a variable in python (jupyter) / Use different functions with same variables
我用python编写了一个小型Programm,但是它没有按预期工作。
这是代码:
puzzle = [8, 7, 5, 4, 1, 2, 3, 0, 6]
def count(p):
p[0] += 1
return p
def main(p):
print(p)
l = count(p)
print(l)
print(p)
b1 = main(puzzle)
我希望print(p)与print(l)不同,但是两者的结果相同,这是print(l)应该具有的结果。 但是p也做了更改,但是我需要将其保持不变……这是一种特殊的python行为吗? 有什么我想念的吗? 我也尝试更改函数中的变量名,但这没有帮助。 我重新启动了编译器,但这也无济于事。
有没有解决方案来存储函数输出,然后再次调用函数而不让函数更改给定参数? 这样,l将成为计算后的结果,而p将保持在该值之前?
亲切的问候,Joh。
您正在传递一个List参数。 参数传递是按对象调用。 由于列表在这种情况下是可变对象,因此类似于通过引用传递,并且对列表对象的更改将继续存在。 如果您传递的是不可变值(例如Integer或String),则类似于通过复制/值传递,并且更改不会持久。 例如:
def s2asdf(s):
s = "asdf"
s = "hello world"
s2asdf(s)
print s
... 结果是:
$ python example.py
hello world
这样做的原因是因为Python通过引用传递了函数参数。 当您调用count
函数时,它允许该函数修改函数内部的列表,并且更改将应用于原始对象。
如果要让函数不修改列表而是返回其他列表,则必须通过将副本传递给函数或在函数内部进行复制来复制列表。 有很多方法可以在Python中复制列表,但是我喜欢使用list()
函数来实现。
这应该可以解决您的问题:
puzzle = [8, 7, 5, 4, 1, 2, 3, 0, 6]
def count(p):
new_list = list(p) # copy values of p to new_list
new_list[0] += 1
return new_list
def main(p):
print(p)
l = count(p)
print(l) # l is the new_list returned from count
print(p) # p stays the original value
b1 = main(puzzle)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.