在Python中的全局变量名

7
我想要确定两个数字N1和N2是否为相同数字的排列。例如,123和321是相同数字的排列,而234和123则不是。我使用Python解决了这个问题,但我不是专家。 我在Windows 7上使用IDLE Python GUI。规格为Python 2.7.3(默认值,Apr 10 2012,23:31:26)[MSC v.1500 32 bit(Intel)] on win32。 以下是Python代码:
def k(n, m):
    s1 = n
    s2 = m
    k = 0
    fl = 0
    while k < 10 :
        arr1[k] = 0
        arr2[k] = 0
        k = k + 1
    while s1 > 0 :
        t = s1 % 10
        arr1[t] = 1
        t = s2 % 10
        arr2[t] = 1
        s1 = s1 / 10
        s2 = s2 / 10
    k = 0
    while k < 10 :
        if arr1[k] != arr2[k]:
            fl = 1
        k = k + 1
    return fl

我将文件保存为k.py,并使用以下命令进行导入:import k。但是当我尝试执行代码k.k(123, 321)时,出现了以下错误。

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    k.k(123,321)
  File "k.py", line 7, in k
    global arr2
NameError: global name 'arr1' is not defined

我尝试按以下方式声明数组,

arr1 = []
arr2 = []

我也尝试过,

global arr1 = []
global arr2 = []

并且。
global arr1
global arr2

但我仍然得到相同的错误。我的代码有什么问题?

我查看了以下这些答案在SO上,但是我无法解决我的问题。

帮助定义全局名称

Python中“global”关键字的用法

我认为在Python中你不需要声明任何变量,而是可以直接使用它们。这个假设是否正确?

有什么建议吗?谢谢。


1
可能想考虑使用 sorted(str(n)) == sorted(str(m)),这样更容易理解。 - Jon Clements
@Jon Clements:感谢您提供的简单解决方案 :) - Deepu
2个回答

3
这里不需要处理全局变量,所有内容都应该包含在函数内部。
问题很简单,就是在尝试添加元素之前你没有定义arr1或arr2。你需要在函数中定义它们,以及s1、s2、k和fl。
编辑:我应该补充说,你的代码非常不符合Python的编码规范。所有这些带有递增计数器的while循环应该被替换为for循环:例如for k in range(10)等。但第一个循环甚至是不必要的——你应该有arr1 = [0] * 10,arr2也同样。

+1. 我该如何定义一个数组?我尝试了 arr1 = [] 和 arr2 = []。 - Deepu
你在调用函数之前做了这件事吗? - Matthias
@DDD:问题是:arr1是什么?如果你将其定义为空列表,那么你就不能使用arr1[k] = 0,因为在位置k上没有元素。 - Matthias
@Matthias,虽然是真的,但这不是OP错误的根源。DDD,你确定你在该函数开头以及其他定义中都做了吗?请更新您的代码以显示您所做的内容。 - Daniel Roseman

1
你需要在函数中定义数组。然后将其附加到其中。arr1 = [] 定义一个空数组。
arr1[k] = 2

尝试更改索引为k的值。 因此,您应该将其初始化为一定的大小或附加到空数组(使用append函数)。
另外,如果您想从函数外部访问数组,则可能需要从函数返回数组。

+1。但我的想法是使用索引来检查数字0到9的存在。 - Deepu
你的第一个循环不是初始化为0吗?在创建数组arr1 = []后,使用arr1.append(0)代替索引。或者用arr1 = [0]*10替换循环,它会创建一个包含10个零的空数组。 - nab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接