B谩sicos del Lenguaje

1

Gu铆a de instalaci贸n y conceptos b谩sicos

2

Archivos y slides del curso pr谩ctico de Python

3

IMPORTANTE: Instalando Ubuntu Bash en Windows para facilitarte el seguimiento del curso desde Windows.

4

驴Qu茅 es la programaci贸n?

5

驴Por qu茅 programar con Python?

6

Operadores matem谩ticos

7

Variables y expresiones

8

Presentaci贸n del proyecto

9

Funciones

10

Usando funciones en nuestro proyecto

11

Operadores l贸gicos

12

Estructuras condicionales

Uso de strings y ciclos

13

Strings en Python

14

Operaciones con Strings en Python

15

Operaciones con strings y el comando Update

16

Operaciones con strings y el comando Delete

17

Operaciones con strings: Slices en python

18

For loops

19

While loops

20

Iterators and generators

Estructuras de Datos

21

Uso de listas

22

Operaciones con listas

23

Agregando listas a nuestro proyecto

24

Diccionarios

25

Agregando diccionarios a nuestro proyecto

26

Tuplas y conjuntos

27

Tuplas y conjuntos en c贸digo

28

Introducci贸n al m贸dulo collections

29

Python comprehensions

30

B煤squedas binarias

31

Continuando con las B煤squedas Binarias

32

Manipulaci贸n de archivos en Python 3

Uso de objetos y m贸dulos

33

Decoradores

34

Decoradores en Python

35

驴Qu茅 es la programaci贸n orientada a objetos?

36

Programaci贸n orientada a objetos en Python

37

Scopes and namespaces

38

Introducci贸n a Click

39

Definici贸n a la API p煤blica

40

Clients

41

Servicios: L贸gica de negocio de nuestra aplicaci贸n

42

Interface de create: Comunicaci贸n entre servicios y el cliente

43

Actualizaci贸n de cliente

44

Interface de actualizaci贸n

45

Manejo de errores y jerarqu铆a de errores en Python

46

Context managers

Python en el mundo real

47

Aplicaciones de Python en el mundo real

Conclusiones finales

48

Python 2 vs 3 (Conclusiones)

Clases bonus

49

Entorno Virtual en Python y su importancia: Python en el mundo real

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Uso de listas

21/49
Recursos

Python y todos los lenguajes nos ofrecen constructos mucho m谩s poderosos, haciendo que el desarrollo de nuestro software sea

  • M谩s sofisticado
  • M谩s legible
  • M谩s f谩cil de implementar

Estos constructos se llaman Estructuras de Datos que nos permiten agrupar de distintas maneras varios valores y elementos para poderlos manipular con mayor facilidad.

Las listas las vas a utilizar durante toda tu carrera dentro de la programaci贸n e ingenier铆a de Software.

Las listas son una secuencia de valores. A diferencia de los strings, las listas pueden tener cualquier tipo de valor. Tambi茅n, a diferencia de los strings, son mutables, podemos agregar y eliminar elementos.

En Python, las listas son referenciales. Una lista no guarda en memoria los objetos, s贸lo guarda la referencia hacia donde viven los objetos en memoria

Se inician con [] o con la built-in function list.

Aportes 79

Preguntas 7

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Tambien se puede generar una copia de la lista con lista[::]

paises
Out[20]: ['Espa帽a', 'Alemania', 'Suiza']
eu = paises[::]
paises[0] = 'Portugal'
paises
Out[23]: ['Portugal', 'Alemania', 'Suiza']
eu
Out[24]: ['Espa帽a', 'Alemania', 'Suiza']

Cuidado Fuente de Bugs!!!

Cuando se hace una lista igual a otra, al cambiar una se modifica tambi茅n la otra:

countries = ['Ecuador','Venezuela','Colombia','Argentina']
global_countries = countries
countries[0] = 'Guatemala'
countries
鈥橤uatemala鈥, 鈥榁enezuela鈥, 鈥楥olombia鈥, 鈥楢rgentina鈥橾
global_countries
[鈥楪uatemala鈥, 鈥榁enezuela鈥, 鈥楥olombia鈥, 鈥楢rgentina鈥橾
global_countries[3] = 'Panama'
countries
[鈥楪uatemala鈥, 鈥榁enezuela鈥, 鈥楥olombia鈥, 鈥楶anama鈥橾
global_countries
[鈥楪uatemala鈥, 鈥榁enezuela鈥, 鈥楥olombia鈥, 鈥楶anama鈥橾``

Para evitarlo se debe utilizar la libreria copy

import copy
global_countries = None
global_countries = copy.copy(countries)
countries
[鈥楪uatemala鈥, 鈥榁enezuela鈥, 鈥楥olombia鈥, 鈥楶anama鈥橾
global_countries
[鈥楪uatemala鈥, 鈥榁enezuela鈥, 鈥楥olombia鈥, 鈥楶anama鈥橾
countries[0] = 'Honduras'
countries
[鈥楬onduras鈥, 鈥榁enezuela鈥, 鈥楥olombia鈥, 鈥楶anama鈥橾
global_countries
[鈥楪uatemala鈥, 鈥榁enezuela鈥, 鈥楥olombia鈥, 鈥楶anama鈥橾

Diferentes formas de copiar una lista

Este hilo detalla las formas de copiar una lista https://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list

++Copy the list, you have various possibilities:
++

  • You can use the builtin list.copy() method (available since python 3.3):
new_list = old_list.copy()
  • You can slice it:
new_list = old_list[:]
  • You can use the built in list() function:
new_list = list(old_list)
  • You can use generic copy.copy():
import copy
new_list = copy.copy(old_list)
  • If the list contains objects and you want to copy them as well, use generic copy.deepcopy():
import copy
new_list = copy.deepcopy(old_list)

Jugando un poco encontr茅 que aunque si bien las listas son objetos que viven en diferentes lugares en la memoria, los objetos que contienen si son iguales vivir谩n en el mismo lugar en memoria, por ejemplo:

Python 3.6.9 (default, Nov 7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type 鈥渉elp鈥, 鈥渃opyright鈥, 鈥渃redits鈥 or 鈥渓icense鈥 for more information.

a =[1,2,3,4,5]
b = [1,2,3,4,5]
id(a[0])
10914496

id(b[0])
10914496

140264765992776

id(b)
140264766007112

el id de a y de b son diferentes, pero id(a[0]) y id(b[0]) son iguales

Cosas curiosas que uno encuentra!

para los que vienen de otros lenguajes las list se manejan como arrays en otros lenguajes no es lo mismo pero es parecido para comprenderlo

otra manera de copiar objetos iterables como listas o strings es utilizando la notaci贸n slice [::] por ejemplo

countries = ["v","m","c"]
global_countries = countries[::]

con esta notaci贸n obtenemos el mismo resultado que utilizar la libreria copy

Cuando vi que Aroesti se cambio la camisa, contesto indirectamente a mi pregunta, de si grabo todo el curso en una jornada.

Tambien se puede copiar una lista asi, nueva_lista = vieja_lista.copy()

Creo que seria mejor si se usa la palabra, iterar en ves de ciclar no se pero se escucha bastante extra帽o xD

una lista es un objeto que funciona como iterador

Si se quieren modificar los elementos de una dos listas que comparten los mismos elementos, y que cuando se haga dicho cambio solo afecte a la lista que estamos modificando, se utiliza el modulo copy.

Crear una variable que tome el valor de la lista para que ambas variables apunten al mismo valor en memoria. Si se cambia un elemento de la lista, se cambia en las dos variables.

En esta pagina viene un poco mas de informacion sobre el uso de listas: https://automatetheboringstuff.com/2e/chapter4/ 鈥e parece interesante como complemento al video鈥

Casos para declarar una lista que depende del original y cuando podemos hacer una copia independiente

import copy

lista=[1,2,3,4]
lista_dependiente = lista
lista_independiente1 = lista.copy()
lista_independiente2 = lista[:]

print ("lista: ",lista,"\nlista_dependiente: ", lista_dependiente,"\nlista_independiente1: ",lista_independiente1,"\nlista_independiente2: ",lista_independiente2)

lista[0] = 0

print ("\nlista: ",lista,"\nlista_dependiente: ", lista_dependiente,"\nlista_independiente1: ",lista_independiente1,"\nlista_independiente2: ",lista_independiente2)

Resultado:

lista:  [1, 2, 3, 4] 
lista_dependiente:  [1, 2, 3, 4] 
lista_independiente1:  [1, 2, 3, 4] 
lista_independiente2:  [1, 2, 3, 4]

lista:  [0, 2, 3, 4] 
lista_dependiente:  [0, 2, 3, 4] 
lista_independiente1:  [1, 2, 3, 4] 
lista_independiente2:  [1, 2, 3, 4]

l

Estructuras de Datos con Python 馃悏

.
Las estructuras de datos est谩ndar que incorpora Python son: list, tuple, dict, y set.
.
En estas clases veremos el uso de las listas las cuales pueden aplicar diferentes m茅todos para aumentar su funcionalidad. Los m茅todos son:
append(). Agrega un elemento al final de la lista.

list.append(item)

clear(). Quita todos los elementos de la lista.

list.clear()

copy(). Regresa (copia), los elementos de la lista.

new_list = list.copy()

count(). Regresa el n煤mero de veces que un elemento aparece en la lista.

list.count(element)

extend(). Agrega elementos de un iterable(lista, tupla, string, etc) al final de la lista actual.

list1.extend(iterable)

index() Regresa el 铆ndice del primer elemento con el valor espcificado.

list.index(element, start, end)

insert(). Agrega elementos en una posici贸n de 铆ndice espec铆fica.

list.insert(i, elem)

pop(). Quita elementos de una posici贸n espec铆fica y permite agregarlos a otra lista.

list.pop(index)

remove(). Elimina el primer elemento que encuentra en la lista con el valor dado. Regresa None.

list.remove(element)

reverse(). Invierte el orden de la lista. No toma argumentos.

list.reverse()

sort(). Ordena la lista de forma ascendente o descendente(reverse = True). No retorna valores.

list.sort(key=..., reverse=...)

tip para crear listas con range

definimos una variable que contenga a range

mi_lista = = range(10)

y pasamos la variable por la funci贸n list

list(mi_lista)

listo tendremos este output

print(mi_lista)

out

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

Creo que no es necesario importar copy, las listas tienen un metodo llamado copy(), para copiar

global_countries = country.copy()

min 2:20, si son mutables porque el slider dice my_list[2] = 6? si previamente se le asigno a my_list = [1, 2, 3]?

Las listas en Python son referenciales, es decir, acceden a una referencia en memoria del objeto.

import copy

countries = ['M茅xico', 'Venezuela', 'Colombia', 'Argentina']
ages = [12, 18, 24, 34, 50]
weights = [12, 18, 24, 34, 50]
print(id(countries))
print(id(ages))
print(id(weights))

receta = ['Ensalada', 2, 'lechugas', 5, 'jitomates']
countries[0] = 'Ecuador'

name = 'David'
print(name[0])
# name[0] = 'd'  # Error Los strings son inmutables

# alias, apuntan al mismo objeto
global_countries = countries
print(id(countries))
print(id(global_countries))

countries[0] = 'Guatemala'
print(countries)
print(global_countries)

# Como copiar una lista en otra lista como objeto nuevo, usamos la lib copy
print('#' * 25)
global_countries = None
global_countries = copy.copy(countries)
print(id(countries))
print(id(global_countries))

countries[0] = 'Honduras'
print(countries)
print(global_countries)

# Ciclar sobre una lista
for country in countries:
    print(country)

(Apunte)

Para copiar listas podemos usar IMPORT COPY:

import copy
lista_1 = [1,2,3,4]
lista_2 = copy.copy(lista_1)

lista_1[0] = 5

lista_1 = [5,2,3,4]
lista_2 = [1,2,3,4]

Una lista es una estructura de datos y un tipo de dato en python con caracter铆sticas especiales. Lo especial de las listas en Python es que nos permiten almacenar cualquier tipo de valor como enteros, cadenas y hasta otras funciones; por ejemplo:

lista = [1, 2.5, 'DevCode', [5,6] ,4]

Una lista es un arreglo de elementos donde podemos ingresar cualquier tipo de dato, para acceder a estos datos podemos hacer mediante un 铆ndice.

print lista[0] # 1
print lista[1] # 2.5
print lista[2] # DevCode
print lista[3] # [5,6]
print lista[3][0] # 5
print lista[3][1] # 6
print lista[1:3] # [2.5, 'DevCode']
print lista[1:6] # [2.5, 'DevCode', [5, 6], 4]
print lista[1:6:2] # [2.5, [5, 6]]

Como pueden darse cuenta podemos hasta insertar una lista dentro de otra lista.

Si no quieres estar imprimir uno por uno los elementos de una lista, puedes recorrerlo utilizando un for.

for element in lista:
    print element

FUENTE: https://devcode.la/tutoriales/listas-python/

Muy interesante al copiar una lista solo asignandola es como si dijeramos que apuntas al mismo lugar de memoria. usando copy si creamos una lista que apunta a otro lugar de memoria pero con los mismo datos.

Buena explicaci贸n de listas. 馃挋

Si los Strings ocupan el mismo hueco en la memoria es por el hecho de que son inmutables, por lo tanto nunca cambiar谩.

Si hici茅ramos dos listas iguales y ocuparan el mismo hueco en la memoria, 驴Qu茅 pasar铆a en el momento en el que se cambia alg煤n elemento de una de las listas鈥???

Resumiendo, que no pueden ocupar el mismo hueco

Como evitar bugs a la hora de copiar listas.

Como evitar bugs a la hora de copiar listas.

Otra forma de duplicar listas:

>>> list1 = ["one", "two", "three"]
>>> list2 = list(list1)
>>> list1 is list2
False 

lista = list(paises)
lista = [i for i in paises ]
lista = paises[::]
o usando copy

Listas en Python

Los Strings son inmutables.

PELIGRO, FUENTE DE BUGS: Si hacemos algo como:

paises = ['M茅xico','Colombia','Ecuador']
countries = paises

Ahora ambas listas apuntan a la misma direcci贸n en memoria y tienen los mismos valores, SI MODIFICAMOS UNA SE MODIFICAR脕 LA OTRA TAMBI脡N

驴C贸mo solucionar esto? Simplemente haciendo una copia de la lista.

paises = ['M茅xico','Colombia','Ecuador']
countries = paises[:]

Con esto ambas listas apuntan a una direcci贸n en memoria diferente. Ya podemos modificarlas sin que la otra se vea afectada.

Cuando tenemos listas con valores iguales, pero las comparamos como objetos, son diferentes.

Las listas en Python son diferenciales, es decir que estas no guardan en memoria directamente los objetos, solo guarda la referencia de d贸nde viven los objetos en memoria.

para agregar un nuevo elemento ala lista se utiliza el keyword o 鈥減alabra clave鈥 append

Eje:

pais.append(鈥渁lemania鈥) #aki se le dice que ala lista pais agregele un elemento llamado alemania
pais
[鈥榤exico鈥, 鈥榗olombia鈥, 鈥榮uiza鈥, 鈥榓lemania鈥橾

pais2
[鈥榤exico鈥, 鈥榓lemania鈥, 鈥榮uiza鈥橾

#No afecta ala otra lista

  • Las estructuras de datos, nos permiten agrupar de distintas maneras varios valores y elementos.
  • Las listas son una secuencia de valores y a diferencia de los string son mutables, es decir se puede agregar, modificar y quitar elementos.
  • Una lista no guarda en memoria los objetos, s贸lo la referencia a ellos.

驴se puede decir que una lista es un objeto?

Ufff genial ese modulo de copy, gracias maestro!!

Importando el modulo copy

Los Strings son inmutables como listas, son 鈥渕utables鈥 cuando se reasigna su valor sin embargo realmente creo un nuevo objeto cuando se reasigna

Listas: Secuencias de valores.

Espero ver la creaci贸n de arreglos y como agregarlos. Hab铆a encontrado algo como:

my_list.append([2,5])

隆Gracias!

Buena documentacion

Alias

Una lista es una estructura de datos y un tipo de dato en python con caracter铆sticas especiales. Lo especial de las listas en Python es que nos permiten almacenar cualquier tipo de valor como enteros, cadenas y hasta otras funciones.

Ejercicios realizados.

Material complementario para Listas en Python

1.Tutorial Python 3.6 - Cap 4.1.3. Listas http://docs.python.org.ar/tutorial/3/introduction.html#listas

  1. .Tutorial Python 3.6 - Cap 6.1 M谩s sobre Listas http://docs.python.org.ar/tutorial/3/datastructures.html#mas-sobre-listas

Codigo en GitHub del curso - List https://github.com/platzi/curso_Python3/blob/9-lists/main.py

  1. https://www.learnpython.org/en/Lists

Un poco de info adicional de listas: https://devcode.la/tutoriales/listas-python/

Otra forma de hacer una copia de una lista y poder modificar los valores de cada una de las lista es con la funci贸n list, por ejemplo:

global_countries = list(countries)

Estas listas tambien se conocen como arrays.
Tal vez asi algunos lo capten mas rapido

馃槷 馃槷 :OOOOOOO DIOooss esto es lo que me pasaba xD uno nunca deja de aprender

Hola, no entiendo porque en la funci贸n list_clients(), no se usa el operador 鈥済lobal鈥 para alcanzar la variable 鈥渃lients鈥 y en el resto s铆.

Un saludo

Muy interesante!

muy efectivo este nuevo metodo que aprendi

Estructuras de datos: Agrupar de distintas maneras, varios valores, elementos, etc. En nuestro programa

Listas: Secuencia de valores.
*Las listas a diferencias de los strings, son mutables.
*Las listas en python: Son referenciales(No guarda en memoria directamente los objetos, guarda referencia hacia donde viven los objetos en memoria)

Hice el ejercicio de hacer una lista, de dos listas, como apuntaban a la misma direccion de memoria.
Si hacia un cambio en una se reflejaba en la otra:

Nota: Los elementos de las listas son modificables y los de los strings no.

Una lista es una estructura de datos y un tipo de dato en python con caracter铆sticas especiales. Lo especial de las listas en Python es que nos permiten almacenar cualquier tipo de valor como enteros, cadenas y hasta otras funciones

  • Las listas si son mutables.
  • Accedemos a sus elementos con sus 铆ndices.
  • Las listas son referenciales, guardan una referencia de memoria.
>>> fruits = ['apple', 'banana', 'watermelon']
>>> fruits_1 = fruits>>> fruits
['apple', 'banana', 'watermelon']
>>> fruits_1
['apple', 'banana', 'watermelon']
>>> fruits[1] = 'cherry'
>>> fruits
['apple', 'cherry', 'watermelon']
>>> fruits_1
['apple', 'cherry', 'watermelon']
>>>

Forma correcta de copiar listas:

>>> import copy
>>> fruits = ['apple', 'banana', 'watermelon']
>>> fruits_1 = copy.copy(fruits)
>>> fruits
['apple', 'banana', 'watermelon']>>> fruits_1
['apple', 'banana', 'watermelon']
>>> fruits[1] = 'cherry'>>> fruits
['apple', 'cherry', 'watermelon']
>>> fruits_1
['apple', 'banana', 'watermelon']
>>>

Copiar un arreglo en Python

import copy

Cuando se crea la copia de la lista en:

global_countries = copy.copy(countries)

No se guardan en el mismo id, es decir, a pesar de que countries y global_countries contienen la misma lista en un principio, no estan apuntando al mismo lugar en memoria, es por ello que cuando se realizan los cambios, en uno no afectan al otro.

Hay diferencia en crear Lista con par茅ntesis " ( ) " que con " [ ] " corchetes?
newListParentesis = [1,2,3]
Vs.
newListCorchetes = [1,2,3]

  1. M茅todos para crear listas:
<Forma1>
Mylist = list()
<Forma2>
Mylist = ['','','','']
  1. M茅todos para agregar elementos a lista:
<Forma1>
Mylist.append('Nuevo Elemento')

esta forma agrega un nuevo elemento al final de la lista

<Forma2>
Mylist.extend(otra lista)

Esta forma permite agregar una lista existente al final de la lista ya creada, ejemplo:

Lista1 = ['Pedro', 'Pablo', 'Juan']
Lista2 = ['Lucas']
Lista1.extend(lista2)
lista1
 ['Pedro', 'Pablo', 'Juan', 'Lucas']

Otra forma de agregar es:

<Forma3>
Mylist.insert(posici贸n, 'nuevo elemento']

Lista1.insert(0, 'Marcos')
Lista1
['Marcos', 'Pedro', 'Pablo', 'Juan', 'Lucas']
  1. Metodo para Eliminar
<Valor>
Mylist.remove('Valor o Elemento')
<Indice>
Mylist.pop(indice)

En la funci贸n pop() sino se agrega indice se borra el ultimo valor de la lista

Para evitar los bugs que puede traer hacer un alias con las listas, la soluci贸n m谩s sencilla que podemos hacer para evitar posibles inconsistencias, es asignando al alias, la lista junto con el m茅todo .copy() (en el caso del objeto listas)

Una varible que es asignada para contener otra variable con otro valor, se le llama Alias,

Hacer una reasignaci贸n con los string, no es igual que con las listas en las que hacemos: list_1[3] = 2, nos lanza un TypeError debido a que no es posible alterar una pieza singular de un string.

Cuando tenemos listas, con las mismas referencias, python marcar谩 su valor como verdadero.

Tenemos varios mecanismos para ciclar sobre las listas[]

Las listas pueden declararse de forma literal (square brackets y su contenido) o luego con la built-in function.

Las listas son vectores, y vectores que contienen a m谩s vectores son matrices.

Caracteresiticas de listas: Las listas se pueden acceder a trav茅s de indices, 茅stos indices inician en cero (0) al igual que los strings pero a diferencia de ellos son un tipo de datos mutables, para a帽adir mas elementos a una lista podemos utilizar el metodo append

amigos=list()
amigos.append('Pedro')
amigos[0]
'Pedro'

amigos.append('Enrique')
amigos[1]
'Enrique')

#######
la utilidad del metodo append es ingresa un nuevo valor a la lista pero al final es decir si el tama帽o de la lista es de 6 y utilizamos el metodo append pasaria a sumarse +1

excelente repaso u.u

>>> countries = ['Mexico', 'Colombia', 'Velenzuela', 'Argentina', 'Peru', 'Chile']
>>> ages = [15, 18, 21, 25, 33, 53] 
>>> id(countries)
140161980521664
>>> id(ages)
140161980521728
>>> wights = [15, 18, 21, 25, 33, 53]
>>> id(wights)
140161980521856
>>> receta = ['Ensalada', 2, 'lechugas', 5, 'jitomates', 3]
>>> countries[2] = 'Brasil}
  File "<stdin>", line 1
>>> countries[2] = 'Brasil'
>>> countries
['Mexico', 'Colombia', 'Brasil', 'Argentina', 'Peru', 'Chile']
>>> global_countries = countries
>>> global_countries
['Mexico', 'Colombia', 'Brasil', 'Argentina', 'Peru', 'Chile']
>>> id(global_countries)
140161980521664
>>> id(countries)
140161980521664
>>> countries[3] = 'Paraguay'
>>> global_countries
['Mexico', 'Colombia', 'Brasil', 'Paraguay', 'Peru', 'Chile']
>>> countries
['Mexico', 'Colombia', 'Brasil', 'Paraguay', 'Peru', 'Chile']
>>> import copy
>>> global_countries = None
>>> global_countries
>>> countries
['Mexico', 'Colombia', 'Brasil', 'Paraguay', 'Peru', 'Chile']
>>> global_countries = copy.copy(countries)
>>> global_countries
['Mexico', 'Colombia', 'Brasil', 'Paraguay', 'Peru', 'Chile']
>>> countries
['Mexico', 'Colombia', 'Brasil', 'Paraguay', 'Peru', 'Chile']
>>> countries[3] = 'Guayana'
>>> countries
['Mexico', 'Colombia', 'Brasil', 'Guayana', 'Peru', 'Chile']
>>> global_countries
['Mexico', 'Colombia', 'Brasil', 'Paraguay', 'Peru', 'Chile']
>>> for country in countries:
...     print(country)
... 
Mexico
Colombia
Brasil
Guayana
Peru
Chile

Me adelante un poco 馃槂)

<
clients = ['pepe', 'dracula']

def createCliente(clientName):
    global clients
    
    if clientName not in clients:
        clients.append(clientName)
    else:
        _clientExistentPrint()
        listClients()


def updateClient(clientName, updatedClientName):
    global clients
    
    countList = len(clients)

    if clientName in clients:
        for i in range(countList):
            if clients[i] == clientName:
                clients[i] = updatedClientName
    else:
        _clientNotFoundPrint()


def deleteClient(clientName):
    global clients

    if clientName in clients:
        clients.remove(clientName)
    else:
        _clientNotFoundPrint()

>

Mis observaciones
1.
Direcci贸n de memoria de strings

s1 = "d"
s2 = "d"

Ambos tienen misma direcci贸n de memoria
Sin embargo

s1 = "da"
s2 = "da"

s1 y s2 tienen diferente direcci贸n de memoria

Copiar una lista por referencia

L1 = L2

Copiar una lista por valor sin usar el m贸dulo Copy

L1 = list(L2) #Constructor
L1 = L2[:] #Slicing
L1 = L2.copy() #M茅todo de clase

Saludos