【问题标题】:Turning a tuple inside a function into a global value将函数内部的元组转换为全局值
【发布时间】:2019-04-19 14:56:05
【问题描述】:

我正在尝试将文本文件的文本转换为元组。我是一名 Python 初学者,并假设这段代码不会像它可能的那样直接,而且对我来说没问题(现在)。我要做的就是使元组 numbers_bank 成为全局值,以便我可以在函数外部访问它。

从函数内部打印元组有效,但在函数外部不起作用。

谁能告诉我我做错了什么? (要求输出是一个元组,否则我会将其更改为列表并仅附加元素。)

global numbers_bank

def read_numbers():

    file = open("numbers.txt")
    num = file.read().split(",")
    num_new = [s.replace("[", "") for s in num]
    numbers_bank = [a.replace("]", "") for a in num_new]
    tuple(numbers_bank)

read_numbers()
print(numbers_bank)

【问题讨论】:

  • 你不需要一个全局变量——你做错了,如果把它放在首位,它就不会完成任何事情。无论如何,只需将函数的最后一行更改为return tuple(numbers_bank),然后像这样调用它:numbers_bank = read_numbers()

标签: python tuples global


【解决方案1】:

这是全局关键字的工作方式:https://www.programiz.com/python-programming/global-keyword

在你的情况下是:

numbers_bank = None

def read_numbers():
    global numbers_bank

    file = open("numbers.txt")
    num = file.read().split(",")
    num_new = [s.replace("[", "") for s in num]
    numbers_bank = [a.replace("]", "") for a in num_new]
    tuple(numbers_bank)  # Note: this doesn't do anything

read_numbers()
print(numbers_bank)

但是,全局变量应该是avoided。 相反,您应该使函数以下列方式返回数字银行:

def read_numbers():
    file = open("numbers.txt")
    num = file.read().split(",")
    num_new = [s.replace("[", "") for s in num]
    numbers_bank = [a.replace("]", "") for a in num_new]
    return tuple(numbers_bank)  # Now the 'tuplified' version of numbers_bank will be used for something because it is returned by the function

numbers_bank = read_numbers()
print(numbers_bank)

还请注意,'tuple(numbers_bank)' 行没有做任何事情,因为您没有将它分配给任何变量。

【讨论】:

  • 谢谢!这是非常有帮助的,也是我正在寻找的那种简单的解决方案。现在它具有全局价值。因此,通过在函数中返回元组,我在调用函数后将其作为输出?
  • 没错!在前面使用全局变量的示例中,您还可以执行以下操作: global numbers_bank untuplified_numbers_bank = [a.replace("]", "") for a in num_new] numbers_bank = tuple(untuplified_numbers_bank) 但第二种解决方案更可取,您可以通过使 read_numbers() 函数返回 tuple()“函数”的输出来将其转换为元组。 tuple() 函数不会更改您放入其中的变量,它只是返回变量的元组版本。
【解决方案2】:

你的要求:

>>> def read_numbers(): 
...:     global numbers_bank 
...:     # do stuff 
...:     numbers_bank = [1, 2, 3] # create some list
...:     numbers_bank = tuple(numbers_bank)                                                                                                                   

>>> read_numbers()                                                                                                                              
>>> numbers_bank                                                                                                                               
(1, 2, 3)

你应该怎么做:

>>> def read_numbers(): 
...:     # do stuff
...:     numbers_bank = [1, 2, 3] # create some list
...:     numbers_bank = tuple(numbers_bank) 
...:     return numbers_bank 

>>> numbers_bank = read_numbers()                                                                                                              
>>> numbers_bank                                                                                                                               
(1, 2, 3)

在函数中更改全局状态可能会变得混乱且难以快速理解。 return 从函数计算的值然后尽可能显式地为该返回值分配一个名称会更简洁。

另请注意,使用tuple(generator-expression) 比使用列表推导然后将tuple 构造函数应用于推导结果更简洁,即

numbers_bank = tuple(a.replace("]", "") for a in num_new)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    相关资源
    最近更新 更多