Python 为什么变量在for循环中超出范围,特别是在函数内部

Python 为什么变量在for循环中超出范围,特别是在函数内部,python,dictionary,unicode,pycharm,Python,Dictionary,Unicode,Pycharm,我期待着一个字典列表,但字典深度不得而知。它可以是list of dict of dict或list of dict of dict.。但是输出是unicode的。所以我需要删除unicode并需要更改它string json_result = [{u'NI': {u'Li': u'0', u'Receive': u'3', u'Slot': u'0002',u'PCID': u'165F', u'PCIV': u'14e4', u'LinkD': u'0','Per': u'44', u'Ma

我期待着一个字典列表,但字典深度不得而知。它可以是
list of dict of dict
list of dict of dict.
。但是输出是unicode的。所以我需要删除unicode并需要更改它
string

json_result = [{u'NI': {u'Li': u'0', u'Receive': u'3', u'Slot': u'0002',u'PCID': u'165F', u'PCIV': u'14e4', u'LinkD': u'0','Per': u'44', u'Max': u'0', u'Pro':u'Br', u'Nic': u'3',u'Co': u'1.36', u'lis': [u'1',u'2']}}]

def abc(json_result):
    temp_res = [{}]
    for key, keyv1 in json_result.iteritems():
        if type(keyv1) is dict:
            temp_res[0][str(key)] = {}
            abc(keyv1)
            temp_res[0].update({key:keyv1})
        elif type(keyv1) is list:
            for i in xrange(len(keyv1)):
               keyv1[i] = str(keyv1[i])
               key = str(key)
        else:
            key = str(key)
            keyv1 = str(keyv1)

    return temp_res

ret = abc(json_result[0])
print ret
输出

[{'NI': {u'Slot': u'0002', u'Receive': u'3', u'lis': ['1', '2'], 'Per': u'44', u'Li': u'0', u'LinkD': u'0', u'PCIV': u'14e4', u'Co': u'1.36', u'Nic': u'3', u'Pro': u'Br', u'PCID': u'165F', u'Max': u'0'}}]
如果观察输出,则第一个键
NI
已转换为
string
,并且
dict
中的
列表也转换为
字符串。但其他人不是,为什么??
当我调试代码时,我可以看到,它在
else
中变为
字符串,但在最终输出中,它没有反映原因?

还有一件事
pycharm
shadows
另一部分告诉我们,不使用局部变量
key和keyv1
。。为什么?

你的主要问题是,当你复发时,你会丢掉结果。你有

abc(键V1)

但您不会将返回的结果保存在任何地方。你必须用这个来修改原来的字典。改变key和keyv1并不能达到目的;这些是局部变量

警告是正确的:在该else子句中,设置局部变量,返回循环的顶部,然后为这些变量获取新值,丢弃刚才的字符串值。同样,您需要将它们放入字典中——您正在构建的临时值

我认为这将有助于:

temp_res[0][str(key)] = abc(keyv1)
...
else:
    temp_res[0][str(key)] = str(keyv1)
你知道这是怎么回事吗

输出:

[{'NI': [{'Slot': '0002', 'PCIV': '14e4', 'Co': '1.36', 'Receive': '3', 'Nic': '3', 'Pro': 'Br', 'Per': '44', 'Li': '0', 'PCID': '165F', 'LinkD': '0', 'Max': '0'}]}]

你的主要问题是,当你复发时,你会丢掉结果。你有

abc(键V1)

但您不会将返回的结果保存在任何地方。你必须用这个来修改原来的字典。改变key和keyv1并不能达到目的;这些是局部变量

警告是正确的:在该else子句中,设置局部变量,返回循环的顶部,然后为这些变量获取新值,丢弃刚才的字符串值。同样,您需要将它们放入字典中——您正在构建的临时值

我认为这将有助于:

temp_res[0][str(key)] = abc(keyv1)
...
else:
    temp_res[0][str(key)] = str(keyv1)
你知道这是怎么回事吗

输出:

[{'NI': [{'Slot': '0002', 'PCIV': '14e4', 'Co': '1.36', 'Receive': '3', 'Nic': '3', 'Pro': 'Br', 'Per': '44', 'Li': '0', 'PCID': '165F', 'LinkD': '0', 'Max': '0'}]}]
从哪里开始

1) 我不确定您认为
abc(keyv1)
有什么作用,但是
abc
有一个您忽略的返回值,所以这可能是一个问题。如果您试图使
abc
成为“就地”功能,请不要这样做。这只会使您的代码更难阅读和理解

2) 在else中,如果您试图更改
keyv1
keyv1[i]=str(keyv1[i])
。不要这样做,创建一个新列表并返回

3) 在else子句中,你说
key=str(key)
,但是你不在任何地方使用
key
。您需要将
放入您的返回结构中

4) Python字典不能保证字典中键的类型与用于更新字典的变量的类型相同。例如,尝试以下方法:

d = dict(one=1)
d[unicode('one')] = 'new value'
key = d.keys()[0]
print key, ':', type(key) # one : <type 'str'>
从哪里开始

1) 我不确定您认为
abc(keyv1)
有什么作用,但是
abc
有一个您忽略的返回值,所以这可能是一个问题。如果您试图使
abc
成为“就地”功能,请不要这样做。这只会使您的代码更难阅读和理解

2) 在else中,如果您试图更改
keyv1
keyv1[i]=str(keyv1[i])
。不要这样做,创建一个新列表并返回

3) 在else子句中,你说
key=str(key)
,但是你不在任何地方使用
key
。您需要将
放入您的返回结构中

4) Python字典不能保证字典中键的类型与用于更新字典的变量的类型相同。例如,尝试以下方法:

d = dict(one=1)
d[unicode('one')] = 'new value'
key = d.keys()[0]
print key, ':', type(key) # one : <type 'str'>

你为什么要这么做?若你们使用的是非ascii字符,那个么str不会很好地结束,正如idjaw所指出的那个样,你们永远不会真正使用key或key1@PadraicCunningham:我认为递归是找出字典深度的唯一方法。这就是我这样做的原因。如果你有任何其他方法来解决这个问题,请指导,@Rasmiranjanayak,递归很好,如果有点过于复杂,我会更关心在unicode上调用str,你到底想做什么?你为什么要这么做?若你们使用的是非ascii字符,那个么str不会很好地结束,正如idjaw所指出的那个样,你们永远不会真正使用key或key1@PadraicCunningham:我认为递归是找出字典深度的唯一方法。这就是我这样做的原因。如果你有任何其他方法来解决这个问题,请指导,@RasmiRanjanNayak,递归是好的,如果有点过于复杂,我更关心的是在unicode上调用str,你到底想做什么?