Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-干净地传递参数_Python_Python 2.7_Arguments_Parameter Passing - Fatal编程技术网

Python-干净地传递参数

Python-干净地传递参数,python,python-2.7,arguments,parameter-passing,Python,Python 2.7,Arguments,Parameter Passing,如果我将城市列表作为变量传递,那么任务将按预期完成 def count_top_rt(tweet_set): for tweet in tweet_set: print(tweet) tweet_set = ["Sydney", "London", "Paris"] print(tweet_set) 如果我在函数定义中输入了错误的参数名,那么任务仍然完成,因为tweet\u集变量是全局变量 def count_top_rt(mis_typed_arguament):

如果我将城市列表作为变量传递,那么任务将按预期完成

def count_top_rt(tweet_set):
    for tweet in tweet_set:
        print(tweet)

tweet_set = ["Sydney", "London", "Paris"]
print(tweet_set)
如果我在函数定义中输入了错误的参数名,那么任务仍然完成,因为tweet\u集变量是全局变量

def count_top_rt(mis_typed_arguament):
    for tweet in tweet_set:
        print(tweet)

tweet_set = ["Sydney", "London", "Paris"]
print(tweet_set)
感觉不恰当地传递论点是错误的。我有两个问题:

  • 在第一个版本中,参数是否正确传递
  • 我有哪些方法可以确保正确地传递论点

  • 有一种简单的方法可以检查:

    >>> def count_top_rt(tweet_set):
    ...     print(id(tweet_set))
    ...     for tweet in tweet_set:
    ...             print(tweet)
    
    >>> tweet_set = ["Sydney", "London", "Paris"]
    >>> count_top_rt(tweet_set)
    1951490534472
    Sydney
    London
    Paris
    >>> id(tweet_set)
    1951490534472
    
    >>> tweet_set2 = ["Sydney", "London", "Paris"]
    >>> count_top_rt(tweet_set2)
    1951490565832
    Sydney
    London
    Paris
    >>> id(tweet_set2)
    1951490565832
    

    如您所见,当一个变量作为变量传递时,无论全局变量的名称是什么,局部变量都会成为它的引用。这是因为解释器首先到局部变量堆栈检查变量(之所以它是引用,是因为函数的“参数”行为),然后才引用全局变量。

    有一种简单的检查方法:

    >>> def count_top_rt(tweet_set):
    ...     print(id(tweet_set))
    ...     for tweet in tweet_set:
    ...             print(tweet)
    
    >>> tweet_set = ["Sydney", "London", "Paris"]
    >>> count_top_rt(tweet_set)
    1951490534472
    Sydney
    London
    Paris
    >>> id(tweet_set)
    1951490534472
    
    >>> tweet_set2 = ["Sydney", "London", "Paris"]
    >>> count_top_rt(tweet_set2)
    1951490565832
    Sydney
    London
    Paris
    >>> id(tweet_set2)
    1951490565832
    

    如您所见,当一个变量作为变量传递时,无论全局变量的名称是什么,局部变量都会成为它的引用。这是因为解释器首先去局部堆栈检查变量(它之所以是引用是因为函数的“参数”行为),然后才引用全局变量。

    参数传递是否“正确”?

    是的,在第一个示例中参数传递正确:例程仅依赖于输入参数

    方法是什么

    在模块化理念中,您无法有效地防止这个问题:您的函数不允许了解任何外部信息。这就是“纯”模块化编程和Python特性有点不一致的地方

    作为程序员,确保这一点的方法是使用不可能冲突的变量名。在这种情况下,将测试驱动程序(主程序)中的tweet_set名称更改为其他名称。如果这是一个长期测试用例,请使用一个不太可能出现在函数中的名称,例如测试\u驱动程序\u tweet\u集

    编程实践

    您可以使用编辑器中的搜索功能突出显示每个名称的所有匹配项。如果依次突出显示每个参数和变量名并“全部查找”,则可以看到哪些参数和变量没有正确键入

    先进技术。。。只是想让你知道“有一天”

    Python的一些特性允许函数查看堆栈,获取下一个函数(调用此函数的函数)的堆栈框架,并检查其活动变量。如果您真的需要这样做,您可以让您的函数根据每个堆栈帧中的变量名检查自己的参数名,直到操作系统中的主程序


    很少有这种情况是有用的。

    参数传递是否“正确”?

    是的,在第一个示例中参数传递正确:例程仅依赖于输入参数

    方法是什么

    在模块化理念中,您无法有效地防止这个问题:您的函数不允许了解任何外部信息。这就是“纯”模块化编程和Python特性有点不一致的地方

    作为程序员,确保这一点的方法是使用不可能冲突的变量名。在这种情况下,将测试驱动程序(主程序)中的tweet_set名称更改为其他名称。如果这是一个长期测试用例,请使用一个不太可能出现在函数中的名称,例如测试\u驱动程序\u tweet\u集

    编程实践

    您可以使用编辑器中的搜索功能突出显示每个名称的所有匹配项。如果依次突出显示每个参数和变量名并“全部查找”,则可以看到哪些参数和变量没有正确键入

    先进技术。。。只是想让你知道“有一天”

    Python的一些特性允许函数查看堆栈,获取下一个函数(调用此函数的函数)的堆栈框架,并检查其活动变量。如果您真的需要这样做,您可以让您的函数根据每个堆栈帧中的变量名检查自己的参数名,直到操作系统中的主程序


    很少有这种情况是有用的。

    防止这种情况的最好方法是避免使用全局变量。将所有代码放入函数和类中

    def count_top_rt(tweet_set):
        for tweet in tweet_set:
            print(tweet)
    
    def main():
        tweet_set = ["Sydney", "London", "Paris"]
        count_top_rt(tweet_set)
    
    main()
    

    如果在
    count\u top\rt
    的定义中拼写错误参数名称,则会引发
    NameError
    ,防止这种情况的最佳方法是避免使用全局变量。将所有代码放入函数和类中

    def count_top_rt(tweet_set):
        for tweet in tweet_set:
            print(tweet)
    
    def main():
        tweet_set = ["Sydney", "London", "Paris"]
        count_top_rt(tweet_set)
    
    main()
    

    如果在
    count\u top\rt

    的定义中拼写错误参数名称,这将引发
    NameError
    ,只需绝对不要对全局变量使用与局部变量相同的名称即可。那么这个问题就永远不会发生。如果您使用PyCharm或类似的IDE,它会告诉您何时自动执行此操作。@Kind第二个函数中的所有问题不是他对全局和局部使用了相同的名称,而是
    for
    循环没有使用它应该使用的局部变量。您为什么在意?你甚至不调用这个函数。无论如何,你最好不要使用全局变量。简单地说,永远不要使用与局部变量相同的名称作为全局变量。那么这个问题就永远不会发生。如果您使用PyCharm或类似的IDE,它会告诉您何时自动执行此操作。@Kind第二个函数中的所有问题不是他对全局和局部使用了相同的名称,而是
    for
    循环没有使用它应该使用的局部变量。您为什么在意?你甚至不调用这个函数。无论如何,最好不要使用全局变量。