繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM