我用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将保持在该值之前?
亲切的问候, 乔。
答案 0 :(得分:1)
您正在传递List参数。参数传递是按对象调用。由于列表在这种情况下是可变对象,因此类似于通过引用传递,并且对列表对象的更改将继续存在。如果您传递的是不可变值(例如Integer或String),则类似于通过复制/值传递,并且更改不会持久。例如:
def s2asdf(s):
s = "asdf"
s = "hello world"
s2asdf(s)
print s
...结果为:
$ python example.py
hello world
答案 1 :(得分:0)
这样做的原因是因为Python通过引用传递了函数参数。当您调用my_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[l[i] for i in range(max(len(v) for v in my_list)) for l in my_list if l]
# => [1, 4, 7, 2, 5, 8, 3, 6, 9]
my_list = [[1, 2, 3], [], [7, 8, 9]]
[l[i] for i in range(max(len(v) for v in my_list)) for l in my_list if l]
# => [1, 7, 2, 8, 3, 9]
函数时,它允许该函数修改该函数内部的列表,并且所做的更改将应用于原始对象。
如果您不希望函数修改列表而是返回其他列表,则必须通过将副本传递给函数或在函数内部进行复制来复制列表。有很多方法可以在Python中复制列表,但是我喜欢使用count
函数来完成它。
这应该可以解决您的问题:
list()