python - Python 中的函数将列表视为全局变量。如何解决这个问题?

标签 python search binary global

我不确定为什么 l 会被 find() 函数修改。我认为由于我在另一个函数中使用了不同的变量,因此 l 不会被该函数修改,因为它不是全局的。

我通过在每个 print 语句之前复制并粘贴 l = [2, 4, 6, 8, 10] 来确保代码中没有错误,并且它返回了正确的输出,意味着 l 正在被函数更改。我还从 main 中删除了 main 函数,基本上使其完全全局化,但它仍然给出了最初的糟糕结果。

我不确定这是否是我对 Python 理解的问题,因为我是 Python 的初学者,而且我来自 Java。

这是代码和结果:

def find(list, user):
    while True:
        n = len(list)
        half = int(n/2)
        if n == 1:
            if user != list[0]:
                return "Bad"
            else:
                return "Good"
        elif user == list[half]:
            return "Good"
        elif user > list[half]:
            del list[0:half]
        elif user < list[half]:
            del list[half:n]
        print(list)

if __name__ == "__main__":
    l = [2, 4, 6, 8, 10]
    print(find(l, 5))  # should print Bad
    print(find(l, 10))  # should print Good
    print(find(l, -1))  # should print Bad
    print(find(l, 2))  # should print Good

但它返回了这个

[2, 4]
[4]
Bad
Bad
Bad
Bad

最佳答案

您应该首先阅读这个问题。 why can a function modified some arguments while not others .

让我重写您的代码以进行澄清。

def find(li, el):
    # li is a list, el is an integer
    # do something using li and el

if __name__ == "__main__":
    l = [1,2,3,4]
    e = 2
    find(l, e)    

函数find接收两个对象作为参数,一个是li,另一个是el。在main中,我们定义了两个对象,一个列表,我们称之为l,和一个整数,我们称之为e。然后这两个对象被传递给find。应该清楚的是,传递给函数的是这两个对象,而不是名称。然后,您的 find 函数就可以访问该对象,在 main 中称为 l,而在 find 中称为 li。因此,当您更改 find 中的 li 时,l 也会更改。

希望能回答您的问题。要解决此问题,请检查deepcopy

关于python - Python 中的函数将列表视为全局变量。如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59573403/

相关文章:

python - 函数参数修正器

python - 将上传的图像存储到 AWS S3

python - 运行后如何清理有毒环境?

assembly - 二进制到BCD转换

python - 如何更改表单中显示的字段名称

javascript - 如何将 javascript 变量放入 html 操作 =""

java - 搜索对象数组和索引位置

python - 什么最适合字符串提取或模式匹配 regex/awk/emacs lisp?

assembly - 汇编 8086 中的减法设置了错误的标志

search - 将 null 插入二叉搜索树