【问题标题】:Why does this not print None then 7? Python为什么这不打印None then 7? Python
【发布时间】:2017-11-03 23:14:35
【问题描述】:

所以我有这个代码并称我为白痴哈哈,但我不能让它打印 None then 7。

代码:

def function(parameter):
    parameter = parameter + 1
parameter = 6
print(function(parameter))
print(parameter == 7)

我需要知道如何更改与函数中的参数同名的变量。

任何帮助将不胜感激,如果您不理解这个问题,我很乐意解释更多。

【问题讨论】:

  • 如果您必须将其用作参数,则不能,因为参数被强制为局部变量。无论如何,这听起来不是一个好主意。
  • 最好不要使用全局变量,因为它们不如局部变量高效 - 为什么不简单地返回 parameter + 1 并设置 parameter = function(parameter) 或类似的东西?

标签: python python-3.x function parameters


【解决方案1】:

它会打印None,因为您的function() 不会返回任何内容。

它打印False,因为parameter(当前为6)不等于7


要更改被局部变量屏蔽的全局变量,请使用globals() 函数:

def function(parameter):
    globals()['parameter'] += 1

【讨论】:

  • 干燥:globals()['parameter'] += 1
  • 或者那个,同样的效果。 (我试图尽可能少地改变他)
【解决方案2】:

因为我真的很讨厌全局变量,所以我会这样做:

def function(parameter):
    return parameter + 1
parameter = function(6)
print(parameter)
print(parameter == 7)

输出

7
True

基本上,通过指定与参数同名的变量并分配函数,您可以更改parameter,就好像它是同一个变量一样。请注意,情况并非如此,它实际上不是同一个对象。但是,如果您的目标是使用相同的名称,它会起作用。

【讨论】:

    【解决方案3】:

    parameter 定义为全局并且实际上不将其作为参数传递:

    def function():
        global parameter
        parameter += 1
    

    【讨论】:

    • 如果您希望它实际打印7,请将最终打印更改为print(parameter),而不是print(paramater == 7)
    【解决方案4】:

    可以做的就是将其称为global。可能会更好地帮助您的是使用 functions 的概念来说明它们的本质:提供任何给定的输入,它们会产生一些结果。

    所以,您可能想使用return

    def fun(val):
      return val;
    
    parameter = val(10)
    print(parameter) # prints '10'
    

    但是,如果你想引用变量,在 python 中你可以做各种疯狂的事情,比如将模块范围作为对象访问并在那里改变它的值:

    def fun(val):
      import sys;
      sys.modules[__name__].parameter = val
    
    parameter = 10
    fun(1)
    print(parameter) # prints '1'
    

    但是,我称之为疯狂是有原因的,因为如果一个函数有副作用,你永远无法从外部判断。这就是您要避免的复杂性。因为您的代码应该尽可能地可预测。原因很明显。

    【讨论】:

      【解决方案5】:

      使用全局变量既不是线程安全的,也不推荐使用。看起来最干净的解决方案是将参数参数传递到可变容器中。见https://docs.python.org/3/faq/programming.html#how-do-i-write-a-function-with-output-parameters-call-by-reference

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-27
        • 1970-01-01
        • 2021-12-30
        • 2022-12-20
        • 2018-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多