Python简单结果问题

img


为什么结果不是:你的座位号是:9

你需要判断x2是否在列表x1,用if

if x2 in x1:

你写的相等于for循环,变量是x2,循环次数是x1
你要的情况直接输出就行,不用循环

x2=9
x1=range(90)
print("你的座位号是: "+str(x2))

img

你在下面for里重新定义了x2,前面x2=9被覆盖掉了
有帮助望采纳

先说结论:
在本例中for 循环中修改了全局变量x2的值,修改的值就是range函数返回的迭代对象中的值。
主要涉及两个方面,一是for循环的使用,二是变量作用域的问题。
一、python的for循环
(1)range函数
range() 函数返回一个可迭代对象(注意类型是对象)
用法:

range(start, stop[, step]),分别是起始、终止和步长,其中start默认为0,step默认为1

[参考]


(2)for循环
根据python的官方文档。for循环对目标列表中的变量进行赋值。并且会覆盖以前对这些变量的所有赋值,包括for循环套件中的赋值:

for i in range(5):   #使用range的迭代对象循环对i进行赋值
    print(i)
    i = 3             # 在这里i=3不起作用,因为下一次for循环会被重新赋值

另外循环完成时,目标列表中的名称不会被删除,但如果序列为空,则循环根本不会为其分配名称。像下面这样:

for i in range(5):
    print(i)
print(i)  #i=4,因为for循环结束后i也不会删除

参考:

二、python中的作用域
Python 的作用域遵循一个叫做LEGB的法则。
当 Python 遇到一个变量的话他会按照这样的顺序进行搜索:
本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)
使用 class, def, lambda 会引入一个本地作用域(Local),而且本地作用域是可以嵌套的。内层的变量会屏蔽外层,内层找不到的变量会去外层找
全局作用域(Global)就是模块内的作用域,他的作用范围是单一文件内。
内置函数的作用域就是int(), list()之类的内置函数。
[参考]

但是在python中无论是for循环还是while循环,它们都不是函数,不会引入新的作用域。

所以for循环中的循环变量 i 的作用域其实和for循环同级,在你的代码中for循环中的变量 x2 依然是全局变量,并且依然可以修改循环体之外的变量。

在例子中:

x2=9  
for x2 in range(90):# 为 x2 重新赋值
    print(x2)    #x2的作用域就是全局作用域,因为for不会引入新的作用域
print(x2)      #x2=89,因为for循环语句中修改了全局变量的值

如果像下面这样写会有如下的输出:

i=80
print(i)  #i=80(全局作用域)
def foo1():#本地作用域
    print("foo1:")
        for i in range(5):#本地作用域    
            print(i)#i从0到4
        print(i)#i=4

def foo2():#本地作用域
    print("foo2:")
    print(i)#i=80(搜索本地作用域没有 i 的定义,会去搜索foo2函数的外层),注意如果要修改 i 的值需要使用global关键字修饰
foo1()
foo2()

输出结果为

80
foo1:
0
1
2
3
4
4
foo2:
80

最后,如果你想输出9-89,可以使用

for x2 in range(9,90)
    print(x2)

如果想修改全局变量可以在在函数中使用global关键词

x2=9
def foo1():
    global x2
    for n in range(3):
        i+=1  
        print(i)
foo1()

输出结果:
10
11
12