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` 在每次迭代中都是增加的。

相关推荐
湫ccc9 分钟前
《Python基础》之pip换国内镜像源
开发语言·python·pip
fhvyxyci10 分钟前
【C++之STL】摸清 string 的模拟实现(下)
开发语言·c++·string
hakesashou11 分钟前
Python中常用的函数介绍
java·网络·python
qq_4597300312 分钟前
C 语言面向对象
c语言·开发语言
菜鸟的人工智能之路21 分钟前
极坐标气泡图:医学数据分析的可视化新视角
python·数据分析·健康医疗
菜鸟学Python22 分钟前
Python 数据分析核心库大全!
开发语言·python·数据挖掘·数据分析
小白不太白95023 分钟前
设计模式之 责任链模式
python·设计模式·责任链模式
喜欢猪猪29 分钟前
Django:从入门到精通
后端·python·django
一个小坑货29 分钟前
Cargo Rust 的包管理器
开发语言·后端·rust
bluebonnet2733 分钟前
【Rust练习】22.HashMap
开发语言·后端·rust