变量的值作为参数传递到 Python 中的方法后不会更新 [duplicate]

Value of variable is not updated after passing it as a parameter into method in Python [duplicate]

提问人:Andrej Lavrinovic 提问时间:1/23/2023 更新时间:1/25/2023 访问量:70

问:

场景: 我在方法中声明了一个值为 0 的变量; 然后,我将此变量作为参数传递给另一个方法,该方法从第一个方法调用。 嵌套方法递增参数值 但是,变量的值仍为 0

问题: 如何更新声明变量的值

例:

def doSomething(parameter):
  number = 0
  doIncrement(parameter, number)
  print(f'New number is: {number}') // New number is: 0

def doIncrement(param, counter):
  for item in param.items(param):
    if not isCountable(item):
      # do something
    else:
      counter += 1
      print('number in the counter:', counter) // number in the counter: 1

我知道没有指向计数器的引用,所以可能应该类似于我们使用指针的 C。在 python 中是如何完成的?

Python 按引用传递

评论

2赞 bereal 1/23/2023
Python 没有按引用传递语义。您可以传递一个可变对象并在函数中更新它,但我更愿意更改不需要它的代码结构,例如,从 .doIncrement
1赞 CcmU 1/23/2023
你也可以考虑有一个全局变量,并使用 global 关键字来修改它
0赞 Andrej Lavrinovic 1/23/2023
我明白了,现在有道理了。我使用了重新分配的方法,效果很好。
2赞 Serge Ballesta 1/23/2023
@CcmU:对于全局变量来说,这不是一个正确的用例,因为其他一些方法(例如返回修改后的值)在这里会更加pythonic。
0赞 CcmU 1/24/2023
@SergeBallesta我确实理解这一点并且我非常同意你的看法,我只想澄清一下,这是获得所需行为的另一种方式

答:

0赞 Andrej Lavrinovic 1/23/2023 #1

现在,当我像这样为每次调用重新分配计数器变量时,它就可以工作了:

def cleanDir(path):
    print("Start cleaning...")
    removedFiles = 0
    removedFiles = removeFiles(path, removedFiles)
    print(f'Files deleted: {removedFiles}') // prints actual number of delete files

def removeFiles(path, filesCounter):
    for name in os.listdir(path):
        file = path + "\\" + name
        if not os.path.isfile(file):
            filesCounter = removeFiles(file, filesCounter)
            os.rmdir(file)
        else:
            print('Deleting file:', file)
            os.remove(file)
            filesCounter += 1
    return filesCounter

评论

1赞 Stuart 1/23/2023
在这种情况下,没有理由将 作为参数传递给 。 可以简单地从 0 开始计数并返回删除的文件数。如果需要将多个计数相加,请在调用函数中执行。filesCounterremoveFilesremoveFiles
0赞 Andrej Lavrinovic 1/24/2023
是的,@Stuart确实有意义.值可以通过方法返回。并分配给 中的变量。是的,多个计数器 - 这是我想将它们作为参数传递的原因。我不知道python支持多次返回。棒。谢谢。removeFilescleanDir
0赞 Ramesh Sankoju 1/23/2023 #2

这是一种方法:

def isCountable(item):
    return False

parameter = {1:"hi", 2: 'how ', 3: 'are you'}

def doSomething(parameter):
    number = 0
    number = doIncrement(parameter, number)
    print(f'New number is: {number}') # New number is: 0

def doIncrement(param, counter):
    for item in param.items():
        if not isCountable(item):
            # do something
            ...
    else:
        counter += 1
        print('number in the counter:', counter)  # number in the counter: 1
    return counter

doSomething(parameter)

评论

0赞 Community 1/25/2023
您的答案可以通过其他支持信息进行改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。