Python中的局部变量和全局变量

Python编程挑战
本文通过三个实战练习提升Python编程技能:解析函数调用顺序、验证回文联与统计字符串元素种类。

2016.11.15

 0.下边程序会输入什么?

def next():
    print('我在next()函数里...')
    pre()

def pre():
    print('我在pre()函数这里...')

next()

答案:

我在next()函数里...

我在pre()函数这里...
1.目测一下程序会打印那些内容?

var = 'Hi'

def fun1():
    global var
    var = 'Baby'
    return fun2(var)

def fun2(var):
    var+='I love you'
    fun3(var)
    return var

def fun3(var):
    var = '小甲鱼'

print(fun1())

 答案:BabyI love you

2.编写一个1函数,判断传入的字符串是否为'回文联'(回文联即用回文形式写成的对联,比如:上海自来水来自上海)

法一:

def palindrome(string):
    list1 = list(string)
    list2 = reversed(list1)
    if list1 == list(list2):
        return '是回文联!'
    else:
        return '不是回文联!'
print(palindrome('上海自来水来自海上'))

 法二:

def palindrome(string):
    length = len(string)
    last = length-1
    length //= 2
    flag = 1
    for each in range(length):
        if string[each] != string[last]:
            flag = 0
        last -= 1

    if flag ==1:
        return 1
    else:
        return 0

string = input('请输入一句话:')
if palindrome(string) == 1:
    print('是回文联!')
else:
    print('不是回文联!')

 3.编写一个函数,分别统计出传入字符串参数(可能不止一个)的英文字母、空格、数字和其它字符的个数。

程序执行结果如图:

count('I love fishc.com.','I love you,you love me.')

 

def count(*param):
    length = len(param)
    for i in range(length):
        letters = 0
        space = 0
        digit = 0
        others = 0
        for each in param[i]:
            if each.isalpha():
                letters += 1
            elif each.isdigit():
                dight += 1
            elif each == ' ':
                space += 1
            else:
                others += 1
        print('第%d个字符串共有:英文字母%d个,数字%d个,空格%d个,其她字符%d个.'%(i+1,letters,space,digit,others))
count('I love tuocheng','I love you,you love me.')

 答案为:

第1个字符串共有:英文字母13个,数字2个,空格0个,其她字符0个.

第2个字符串共有:英文字母17个,数字4个,空格0个,其她字符2个.

<think>好的,我现在需要回答用户关于Python局部变量全局变量的区别及使用场景,特别是global关键字的用法的问题。首先,我应该先理清基本概念,确保自己对这些概念有准确的理解。 用户提到了几个引用,其中引用[1]到[4]主要解释了global关键字的作用,即修改全局变量。根据这些引用,global允许在函数内部修改全局变量,而不仅仅是访问。例如,在函数内部赋值一个全局变量时,如果不使用global,Python会将其视为局部变量,从而导致错误或者无法修改全局变量的值。 接下来,我需要区分局部变量全局变量的定义。局部变量是在函数内部定义的变量,作用域仅限于该函数;而全局变量是在函数外部定义的变量,整个程序都可以访问。不过,如果在函数内部想要修改全局变量,必须使用global声明。 然后,需要考虑使用场景。全局变量适合在多个函数间共享数据的情况,但过度使用可能导致代码难以维护。局部变量则有助于封装,保证函数独立性。global关键字的使用场景就是在需要修改全局变量的时候,而不仅仅是读取它的值。 可能还需要提到nonlocal关键字,虽然用户没有直接问,但引用[2]提到了nonlocal改变的是上一级变量,这可能在嵌套函数中使用,但这里可能不需要详细展开,除非用户的问题涉及。 接下来,我需要组织回答的结构,确保符合用户的要求:结构清晰,分点说明,正确使用LaTeX格式,并在末尾生成相关问题。 需要注意的是,用户提供的引用中有关于快速排序的例子,但当前问题与变量作用域相关,因此不需要涉及排序算法。重点放在变量作用域global的使用上。 现在,检查是否有遗漏点。例如,局部变量全局变量的生命周期,作用域规则,以及使用global可能带来的副作用,比如代码的可读性维护性问题。可能还需要举例说明,比如函数内外变量的访问修改情况。 同时,要确保LaTeX格式正确,所有行内数学表达式用$...$,虽然这个问题可能不涉及数学公式,但如果有代码中的变量名或其他需要强调的部分,可能需要使用代码块。 最后,生成相关问题时要围绕主题,比如区别、使用场景、global的作用、nonlocal的比较、常见错误等。 总结,回答的结构应该是: 1. 定义区别:局部变量全局变量的定义,作用域,生命周期。 2. 访问修改规则:如何访问全局变量,如何修改(需要global)。 3. 使用场景:何时使用全局变量,何时使用局部变量,global的使用场景。 4. 示例代码:展示使用global不使用的区别。 5. 注意事项:全局变量的优缺点,global的谨慎使用。 6. 相关问题:生成几个相关问题供用户进一步学习。 现在,将这些内容用中文组织成自然段落,并正确应用引用标注。比如,在提到使用global修改全局变量时,引用[1][3]来支持这一点。在比较nonlocal时,引用[2]。 还需要注意代码块的正确格式,如Python函数的示例,展示global的使用情况,并确保代码语法正确。 可能遇到的疑问点:是否所有情况下修改全局变量都需要global?比如,在函数内部修改可变对象(如列表)时是否需要global?例如,如果全局变量是列表,函数内部执行append操作,是否需要global?根据Python的规则,修改可变对象的内容不需要global,只有重新赋值时才需要。这点可能需要说明,但用户提供的引用中没有提到,但为了准确性,可能需要补充。例如,引用[4]中的代码显示全局变量是列表,并且在函数内修改了它,但可能没有使用global,这可能是因为在函数内部只是修改了列表的内容,而没有重新赋值列表本身。因此,需要区分修改对象重新绑定的区别。 不过根据用户提供的引用[4],输出结果似乎是在函数内部修改了全局列表,但代码可能使用了global或者没有?引用[4]的描述不明确,但示例输出可能表明在函数内部通过global声明来修改全局列表。需要确认这一点,但根据标准Python规则,修改可变对象的内容不需要global,但重新赋值需要。例如: ```python a = [1,2,3] def func(): a.append(4) # 不需要global func() print(a) # 输出[1,2,3,4] def func2(): a = [5,6,7] # 这里创建的是局部变量a,除非使用global func2() print(a) # 仍为[1,2,3,4] ``` 因此,在回答中需要说明:当在函数内部对全局变量进行重新赋值(即使用=进行赋值)时,需要使用global关键字。而如果只是修改可变对象的内容(如列表的append),则不需要。 这可能是一个重要的点,用户可能在此处容易混淆。因此,在回答中需要明确这一点,并可能通过示例说明。 现在,整合这些思考,开始撰写回答。</think>### Python局部变量全局变量的区别及用法 #### 一、基本定义 1. **局部变量** - 在函数内部定义的变量,作用域仅限于函数内部。 - 生命周期:函数调用时创建,函数执行结束后销毁。 - 示例: ```python def func(): x = 10 # 局部变量 print(x) ``` 2. **全局变量** - 在函数外部定义的变量,作用域为整个模块(或文件)。 - 生命周期:程序运行时创建,程序结束后销毁。 - 示例: ```python y = 20 # 全局变量 def func(): print(y) ``` --- #### 二、访问与修改规则 1. **访问全局变量** 函数内可以直接读取全局变量的值,无需特殊声明: ```python z = 30 def func(): print(z) # 输出30 ``` 2. **修改全局变量** 若需在函数内修改全局变量,必须使用`global`关键字声明: ```python a = 100 def modify_global(): global a a = 200 # 修改全局变量 modify_global() print(a) # 输出200 ``` 未使用`global`时,赋值操作会创建局部变量而非修改全局变量[^1][^3]: ```python a = 100 def failed_modify(): a = 200 # 实际创建了局部变量a failed_modify() print(a) # 输出100(全局变量未改变) ``` 3. **修改可变对象** 对于列表、字典等可变对象,直接修改内容(如追加元素)无需`global`,但重新赋值需要: ```python lst = [1, 2] def append_element(): lst.append(3) # 无需global,直接修改内容 append_element() print(lst) # 输出[1, 2, 3][^4] def reassign_list(): global lst lst = [4, 5] # 需global才能重新赋值 reassign_list() print(lst) # 输出[4, 5] ``` --- #### 三、使用场景 1. **全局变量适用场景** - 多个函数需要共享同一数据时(如配置参数)。 - 需要长期保留的数据(如程序运行状态)。 - **注意**:过度使用会导致代码耦合性高,降低可维护性。 2. **局部变量适用场景** - 函数内部临时计算或存储数据。 - 需要封装数据以隔离外部影响。 3. **`global`的使用场景** - 明确需要在函数内修改全局变量时。 - 需谨慎使用,避免破坏代码模块化。 --- #### 四、常见错误示例 1. **未声明`global`导致意外创建局部变量** ```python count = 0 def increment(): count += 1 # 报错:局部变量count未定义 increment() ``` **修复方法**:添加`global count`。 2. **嵌套函数中需使用`nonlocal`** `nonlocal`用于修改外层(非全局)变量,与`global`互补[^2]: ```python def outer(): name = "aa" def inner(): nonlocal name # 修改上一级变量 name = "bb" inner() print(name) # 输出"bb" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值