在python(jupyter)中复制变量/对相同的变量使用不同的函数

时间:2018-09-05 23:37:02

标签: python function variables duplicates jupyter

我用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将保持在该值之前?

亲切的问候, 乔。

2 个答案:

答案 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()