Python开发 —— 变量、全局变量&函数的参数传递

1. Python变量

1.1 变量的定义和使用

在Python中,变量不需要显式声明。通过赋值语句,变量会自动创建。例如:

python 复制代码
x = 10
y = "Hello, World!"

在这段代码中,`x` 被赋值为整数10,而 `y` 被赋值为字符串 "Hello, World!"。

1.2 变量的类型

Python 是一种动态类型语言,这意味着变量的类型是在赋值时确定的,并且同一变量可以在程序的不同部分保存不同类型的值。例如:

python 复制代码
x = 10
print(type(x))  # 输出 <class 'int'>
x = "Hello"
print(type(x))  # 输出 <class 'str'>

1.3 变量的作用域

变量的作用域决定了变量在程序中的可访问范围。Python 主要有以下两种作用域:

局部变量:在函数内部定义,只在函数内部有效。

全局变量:在函数外部定义,可以在整个程序中访问。例如:

python 复制代码
global_var = "I am a global variable"

def my_function():
    local_var = "I am a local variable"
    print(global_var)  # 可以访问全局变量
    print(local_var)   # 可以访问局部变量

my_function()
print(local_var)  # 会报错,因为 local_var 只在函数内部有效

2. Python的参数传递

2.1 不可变对象(不可变数据类型)

不可变对象包括整数、浮点数、字符串和元组。这些对象在函数中被修改时,会生成新的对象,原对象保持不变。例如:

python 复制代码
def add_one(num):
    num += 1
    return num

a = 5
print(add_one(a))  # 输出 6
print(a)           # 输出 5,a 的值没有被修改

在这个例子中,`num += 1` 创建了一个新的整数对象,而 `a` 的值没有改变。

2.2 可变对象(可变数据类型 )

可变对象包括列表、字典和集合。这些对象在函数中被修改时,会影响到函数外的对象。例如:

python 复制代码
def append_one(lst):
    lst.append(1)

my_list = [0]
append_one(my_list)
print(my_list)  # 输出 [0, 1]

在这个例子中,lst.append(1) 修改了 `my_list` 的内容,因为 `lst` 和 `my_list` 引用的是同一个对象。

3. 开发出现的问题

python 复制代码
def logic_data_record(folder_num):
    folder_num += 1
    return folder_num


folder_num = 0
while True:
    result = logic_data_record(folder_num)
    print(result)

在代码中,`folder_num` 被作为参数传递给 `logic_data_record` 函数,并在函数内部的执行过程中递增。然而,每次调用该函数时,都从外部的 `while` 循环传递相同的初始值 `0` 给该函数,这导致每次调用函数时 `folder_num` 都被重新初始化为 `0`。

4. 解决方法1------使用 global

为了在函数中修改全局变量,需要使用 `global` 关键字声明该变量是全局的。这使得函数内部对该变量的修改会影响到全局作用域中的变量。

4.1 代码示例

python 复制代码
folder_num = 0  # 定义全局变量

def logic_data_record():
    global folder_num  # 声明使用全局变量
    folder_num += 1  # 修改全局变量
    return folder_num

while True:
    result = logic_data_record()  # 调用函数,递增 folder_num
    print(result)  # 输出递增后的值

4.2 详细解释

4.2.1 定义全局变量

python 复制代码
folder_num = 0

folder_num 是一个全局变量,初始值为0。

4.2.2 声明使用全局变量

python 复制代码
def logic_data_record():
    global folder_num  # 声明 folder_num 为全局变量
    folder_num += 1  # 修改全局变量
    
    return folder_num

在 logic_data_record 函数中,使用 global folder_num 声明 folder_num 是全局变量。这样,函数内对 folder_num 的修改会影响到全局范围内的 folder_num。

4.2.3 循环调用函数

python 复制代码
while True:
    result = logic_data_record()  # 调用函数,递增 folder_num
    print(result)  # 输出递增后的值

在 `while` 循环中,每次调用 `logic_data_record` 函数,`folder_num` 都会递增,并将递增后的值打印出来。

通过这种方式,每次循环时 `folder_num` 的值都会递增,并且变化会在全局范围内生效。

5. 解决方法2

为了让 `folder_num` 能够持续递增,需要将递增后的 `folder_num` 值返回给 `while` 循环,并使用这个返回值更新外部的 `folder_num` 变量。这样,每次循环时传递给函数的 `folder_num` 值都会是最新的递增值。

可以修改 `logic_data_record` 函数,使其在最后返回更新后的 `folder_num` 值。然后在 `while` 循环中使用这个返回值来更新外部的 `folder_num` 变量。以下是代码示例:

python 复制代码
def logic_data_record(folder_num):
    folder_num += 1
    return folder_num


folder_num = 0
while True:
    folder_num = logic_data_record(folder_num)
    print(folder_num)

通过这种方式,每次函数调用后都会递增 `folder_num`,并将新值传回主循环,使得下一次函数调用时使用的是递增后的值。这样就可以确保 `folder_num` 在每次迭代中都是增加的。

相关推荐
Null箘7 分钟前
从零创建一个 Django 项目
后端·python·django
云空11 分钟前
《解锁 Python 数据挖掘的奥秘》
开发语言·python·数据挖掘
青莳吖22 分钟前
Java通过Map实现与SQL中的group by相同的逻辑
java·开发语言·sql
Buleall29 分钟前
期末考学C
java·开发语言
重生之绝世牛码31 分钟前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
小蜗牛慢慢爬行37 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
玖年43 分钟前
Python re模块 用法详解 学习py正则表达式看这一篇就够了 超详细
python
Algorithm15761 小时前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
岑梓铭1 小时前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
shinelord明1 小时前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程