Python替代全局变量

Sha*_*mar 6 python function global-variables

import random  

#----------------------------------------------#
def main():  
    create_list_and_find_max_and_min(10)  
    the_smart_way()
#----------------------------------------------#
def create_list_and_find_max_and_min(n):
    global my_array
    my_array = []
    n = input("How many numbers do you want in your array?:")
    for i in range(n):
        my_array.append(random.randint(1,n))
    print "My array is:", my_array
    #----------------------------------------------#
    min = my_array[0]
    for number in my_array:
    if min > number:
        min = number
    print "The minimum value in the array is:", min
    #----------------------------------------------#
    max = my_array[0]
    for number in my_array:
        if max < number:
        max = number
    print "The maximum value in the array is:", max
#----------------------------------------------#
def the_smart_way():
    # "This one uses the built-in Python functions for min/max..."
    min_my_array = min(my_array)
    max_my_array = max(my_array)
    return min_my_array, max_my_array
#----------------------------------------------#
if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

我是使用Python的新手.我一般都听说在编程时使用全局变量是一个不好的做法.那么我有什么替代方法可以在这里做.哪个是从另一个函数里面使用变量"my_array"?谢谢!

aba*_*ert 12

是的,有两种选择.

首先,您可以传递值而不是使用全局变量.例如,create_list_and_find_max_and_min可以在本地创建数组并返回它,然后您可以将其传递给the_smart_way:

import random  

#----------------------------------------------#
def main():  
    my_array = create_list_and_find_max_and_min(10)  
    print the_smart_way(my_array)
#----------------------------------------------#
def create_list_and_find_max_and_min(n):
    my_array = []
    n = input("How many numbers do you want in your array?:")
    for i in range(n):
        my_array.append(random.randint(1,n))
    print "My array is:", my_array
    #----------------------------------------------#
    min = my_array[0]
    for number in my_array:
        if min > number:
            min = number
    print "The minimum value in the array is:", min
    #----------------------------------------------#
    max = my_array[0]
    for number in my_array:
        if max < number:
            max = number
    print "The maximum value in the array is:", max
    return my_array
#----------------------------------------------#
def the_smart_way(my_array):
    # "This one uses the built-in Python functions for min/max..."
    min_my_array = min(my_array)
    max_my_array = max(my_array)
    return min_my_array, max_my_array
#----------------------------------------------#
if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

其次,您可以创建一个封装数据的类和对该数据进行操作的函数:

import random  

#----------------------------------------------#
class MyArrayClass(object):
    def create_list_and_find_max_and_min(self, n):
        self.my_array = []
        n = input("How many numbers do you want in your array?:")
        for i in range(n):
            self.my_array.append(random.randint(1,n))
        print "My array is:", self.my_array
        #----------------------------------------------#
        min = self.my_array[0]
        for number in self.my_array:
            if min > number:
                min = number
        print "The minimum value in the array is:", min
        #----------------------------------------------#
        max = self.my_array[0]
        for number in self.my_array:
            if max < number:
                max = number
        print "The maximum value in the array is:", max
    #----------------------------------------------#
    def the_smart_way(self):
        # "This one uses the built-in Python functions for min/max..."
        min_my_array = min(self.my_array)
        max_my_array = max(self.my_array)
        return min_my_array, max_my_array
#----------------------------------------------#
def main():
    my_array = MyArrayClass()
    my_array.create_list_and_find_max_and_min(10)  
    print my_array.the_smart_way()
#----------------------------------------------#
if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

你应该理解全局变量是不良做法的原因.

想象一下,您想要创建两个数组.对于全局变量,第二个将替换第一个变量,它将永远消失.

create_list_and_fix_max_and_min(10)
create_list_and_fix_max_and_min(20)
# No way to operate on the original array!
Run Code Online (Sandbox Code Playgroud)

使用局部变量,您可以存储它们:

my_array_1 = create_list_and_fix_max_and_min(10)
my_array_2 = create_list_and_fix_max_and_min(20)
the_smart_way(my_array_1)
Run Code Online (Sandbox Code Playgroud)

使用对象提供相同的好处; 两者之间的差异最终归结为操作是否是数据含义的一部分,或者数据是否独立且操作是否通用.(或者,有时候,无论你是更多功能势利小人还是OO势利......)