【问题标题】:Change global string within a method in python 3在python 3中的方法中更改全局字符串
【发布时间】:2015-12-18 17:01:22
【问题描述】:

我用谷歌搜索了我的问题,但没有找到答案。我的问题是: 我正在尝试在 python 3 的方法中更改字符串。我正在尝试这样的小代码:

number_a = 0
number_b = 1

word = 'empty'

def something():
    if number_a > number_b
        word = 'hello'
    else: 
        word = 'goodbye'

something()
print(word)

Python 给我的输出是

empty

我在这里做错了什么?

【问题讨论】:

    标签: python string methods definition


    【解决方案1】:

    函数假定变量是本地的,并且默认情况下分配一个值将创建一个新的本地变量来包含它。非局部的全局变量不受影响。

    这是可取的。否则,您必须为所有内容创建唯一名称,并且总是冒着意外覆盖重要全局变量的风险。

    您可以通过明确告诉 Python 这是您要为其赋值的全局变量来更改此行为。为此,请使用 global 关键字将本地名称显式链接到全局变量:

    def something():
        global word
    
        if number_a > number_b
            word = 'hello'
        else: 
            word = 'goodbye'
    

    有时这是必要的。但是,在您的简单示例中,最好只返回值并在函数之外进行赋值。这样该函数就不会与周围的命名空间绑定:

    def something(number_a, number_b):
        if number_a > number_b
            return 'hello'
        else: 
            return 'goodbye'
    
    word = something(a, b)
    

    【讨论】:

    • 这里使用术语“只读”会产生误导。问题是变量的默认范围是本地的,除非明确声明。
    • 非常感谢。这是我缺少的“全局”关键字。
    【解决方案2】:

    这里的问题是您没有修改字符串,而是重新分配了一个局部变量。该变量在函数之外没有作用域,除非您声明名称 word 具有全局绑定。因此,要解决问题,您需要告诉解释器您正在影响函数内部的全局变量。

    def something():
      global word
      ...
    

    【讨论】:

      【解决方案3】:

      您需要使用global 关键字,因为您的函数中的单词是该函数的本地,但这通常不是可行的方法,您可以返回结果并将单词重新分配给返回值:

      word = 'empty'
      
      def something():
         return 'hello'if number_a > number_b else  'goodbye'
      
      word = something()
      print(word)
      

      另一种方法是将单词放入 可变 结构中:

      word = ['empty']
      
      
      def something():
          if number_a > number_b:
              word[0] = 'hello'
          else:
              word[0] = 'goodbye'
      something()
      print(word[0]) -> "goodbye"
      

      但如果你真的想像这样全局改变值,你可能应该使用 word 是一个属性的类:

      class Foo():
          def __init__(self,word,n1,n2):
              self.word = word
              self.number_a = n1
              self.number_b = n2
      
          def something(self):
              if self.number_a > self.number_b:
                  self.word = 'hello'
              else:
                  self.word = 'goodbye'
      
      inst = Foo("empty",0,1)
      
      inst.something()
      print(inst.word)
      goodbye
      

      【讨论】:

        【解决方案4】:

        word 变量只是在函数外部隐藏了word 变量。这是一个范围问题。如果您想实际更改 word,可以使用 global 关键字,但更 Python 的方法是这样的:

        number_a = 0
        number_b = 1
        
        word = 'empty'
        
        def something():
            if number_a > number_b:
                word = 'hello'
            else: 
                word = 'goodbye'
            return word
        
        word = something()
        print(word)
        

        另一个澄清是你写的是function and not a method

        方法与对象相关联。

        编写这个函数的更简单的方法是这样的:

        def something():
            return 'hello' if number_a > number_b else return 'goodbye'
        

        那么您根本不必隐藏word 变量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-06
          相关资源
          最近更新 更多